package cn.witsky.cdrService.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.witsky.cdrService.config.FtpConfig;

/**
 * Created by raoweikang 2017/3/3.
 */
public class FTPUtil {

    private final static Logger logger = LoggerFactory.getLogger(FTPUtil.class);
    
    public static boolean uploadFile(FtpConfig config,File sourceFile,String dstFileName) throws FileNotFoundException {
    	return uploadFile(config.getHost(),config.getPort(),config.getUserName(),config.getPassWord(),config.getBasePath(),config.getPath(),dstFileName,new FileInputStream(sourceFile));
    }

    /**
     * Description: 向FTP服务器上传文件
     *
     * @param host     FTP服务器hostname
     * @param port     FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param filename 上传到FTP服务器上的文件名
     * @param input    输入流
     * @return 成功返回true，否则返回false
     */
    private static boolean uploadFile(String host, int port, String username, String password, String basePath, String filePath, String filename, InputStream
            input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                logger.error("[error]未连接到FTP，用户名或密码错误。");
                ftp.disconnect();
                return false;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath + filePath)) {
                //如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                boolean dirOk = false;
                for (int i = 0; i < dirs.length; i++) {
                    if (null == dirs[i] || "".equals(dirs[i])) continue;
                    if(StringUtil.isEmpty(tempPath)) {
                        tempPath=dirs[i];
                    }else {
                        tempPath += "/" + dirs[i];
                    }
             
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            if (!ftp.changeWorkingDirectory(tempPath)) {
                                break;
                            } else {
                                if (i == dirs.length - 1) {
                                    dirOk = true;
                                }
                            }
                        } else {
                            if (i == dirs.length - 1) {
                                dirOk = true;
                            }
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    } else {
                        if (i == dirs.length - 1) {
                            dirOk = true;
                        }
                    }
                }
                if (!dirOk) {
                    logger.error("创建目录失败tempPath={}", tempPath);
                    return false;
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            result = ftp.storeFile(filename, input);
            input.close();
            ftp.logout();
        } catch (Exception e) {
            logger.error("[error]FTP连接时发生异常,file={},e={}", filename, e.getMessage());
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    logger.error("[exception]FTP断开时发生异常,e={}", ioe.getMessage());
                }
            }
        }
        return result;
    }
}
